package cn.zysheep.controller;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.fill.FillConfig;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.*;

/**
 * @ClassName: TestController
 * @Author: lyw
 * @Date: 2023/11/14 12:35
 * @Description: TODO(一句话描述该类的功能)
 */
@RestController
@RequestMapping("/api")
public class TestController {

    @GetMapping("download")
    public void download(HttpServletResponse response) throws IOException {
        // 这里注意 有同学反应使用swagger 会导致各种问题，请直接用浏览器或者用postman
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setCharacterEncoding("utf-8");

        InputStream resourceAsStream = TestController.class.getClassLoader().getResourceAsStream("template/perfAmend.xlsx");
        OutputStream outputStream = response.getOutputStream();

        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("绩效目标申报", "UTF-8").replaceAll("\\+", "%20");
        response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");


        // 第一列进行单元格合并
        int[] mergeColumeIndex = {0};
        // 从第11行开始合并
        int mergeRowIndex = 10;


        ExcelWriter excelWriter = EasyExcel.write(outputStream)
                //设置合并单元格策略
                //.registerWriteHandler(new ExcelFillCellMergeStrategy(mergeRowIndex, mergeColumeIndex))
                .withTemplate(resourceAsStream).build();
        WriteSheet writeSheet = EasyExcel.writerSheet().build();

        // 这里注意 入参用了forceNewRow 代表在写入list的时候不管list下面有没有空行 都会创建一行，然后下面的数据往后移动。默认 是false，会直接使用下一行，如果没有则创建。
        // forceNewRow 如果设置了true,有个缺点 就是他会把所有的数据都放到内存了，所以慎用
        // 简单的说 如果你的模板有list,且list不是最后一行，下面还有数据需要填充 就必须设置 forceNewRow=true 但是这个就会把所有数据放到内存 会很耗内存
        // 如果数据量大 list不是最后一行 参照下一个
        FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.FALSE).build();
        excelWriter.fill(data(), fillConfig, writeSheet);


        Map<String, Object> map = new HashMap<>();
        map.put("FISCAL_YEAR", "2023");
        map.put("INS_TYPE_NAME", "城乡居民基本养老保险");
        map.put("MOF_DEP_NAME", "中央主管部门");
        map.put("MANAGE_MOF_DEP_NAME", "中共湖南省委办公厅本级");
        map.put("DEP_NAME", "中共湖南省委办公厅本级");
        map.put("IN_BUDGET", 1000);
        map.put("OUT_BUDGET", 999);
        map.put("OVERALL_SUGG", "城乡居民基本养老保险");
        map.put("ANNUAL_SUGG", "城乡居民基本养老保险");
        excelWriter.fill(map, writeSheet);
        // 关闭流
        excelWriter.finish();

    }


    private List data() {
        List<Map<String, Object>> list = new ArrayList<>();
        HashMap<String, Object> perf1 = new HashMap<>();
        perf1.put("LV1_PERF_IND_NAME", "产出指标");
        perf1.put("LV2_PERF_IND_NAME", "数量指标");
        perf1.put("LV3_PERF_IND_NAME", "数量指标");
        perf1.put("SRC_KPI_VAL", "");
        perf1.put("KPI_VAL", "必须完成20%");


        HashMap<String, Object> perf2 = new HashMap<>();
        perf2.put("LV1_PERF_IND_NAME", "产出指标");
        perf2.put("LV2_PERF_IND_NAME", "时效指标");
        perf2.put("LV3_PERF_IND_NAME", "成本指标细化");
        perf2.put("SRC_KPI_VAL", "");
        perf2.put("KPI_VAL", "必须完成230");

        HashMap<String, Object> perf3 = new HashMap<>();
        perf3.put("LV1_PERF_IND_NAME", "效益指标");
        perf3.put("LV2_PERF_IND_NAME", "经济效益");
        perf3.put("LV3_PERF_IND_NAME", "21 经济效益");
        perf3.put("SRC_KPI_VAL", "");
        perf3.put("KPI_VAL", "");
        list.add(perf1);
        list.add(perf2);
        list.add(perf3);
        return list;
    }


    @PostMapping("upload")
    public String upload(@RequestParam("file") MultipartFile file) throws IOException {
        EasyExcelListener easyExcelListener = new EasyExcelListener();
        EasyExcel.read(file.getInputStream(), easyExcelListener).sheet().doRead();
        List<HashMap> listMap = easyExcelListener.getListMap();
        listMap.forEach(item -> {
            item.forEach((k, v) -> {
                System.out.println(String.format("%s----%s", k, v));
            });
        });
        HashMap<String, Object> map = new HashMap<>();
        int j = 1;
        for (int i = 0; i < listMap.size(); i++) {
            HashMap hashMap = listMap.get(i);
            //收入预算金额 i = 4  k = 3
            if (i == 4) {
                map.put("t_in_budget", Objects.nonNull(hashMap.get(3)) ? hashMap.get(3) : "");
            }
            //支出预算金额 i = 5  k = 3
            if (i == 5) {
                map.put("t_out_budget", Objects.nonNull(hashMap.get(3)) ? hashMap.get(3) : "");
            }
            if (i == 7) {
                //省级总体目标 i = 7 k = 1
                map.put("t_overall_sugg", Objects.nonNull(hashMap.get(1)) ? hashMap.get(1) : "");
                //省级年度目标 i = 7 k = 3
                map.put("t_annual_sugg", Objects.nonNull(hashMap.get(3)) ? hashMap.get(3) : "");

            }
            // 指标明细 i = 9  k = 3
            if (i > 8) {
                map.put("lv" + j + "_kpi_val", Objects.nonNull(hashMap.get(3)) ? hashMap.get(3) : "");
                j++;
            }
        }
        System.out.println(map);
        return "success";
    }
}
